iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0

前言

接下來要介紹SOLID的原則,會一一介紹
今天先從SRP開始

介紹

單一職責原則(SRP, Single Responsibility Principle);這很容易讓其他人粗暴地將其理解為每個模組都只做一件事。
先說,對於函式來說確實是只做一件事情,但對於模組則不是。
根據Clean Architecture的說法是這樣的

一個模組應該只對唯一的一個角色負責。
-Clean Architecture(P54)

聽起來是有聽沒有懂對吧
我們直接當背骨仔來違反他看看

違反的案例: 意外重複

舉個案例
假設我今天有一套計算全部學校學生成績的系統
學校有三種學生:a, b, c
實際上這三種學生考試的科目和成績計算方式完全不同(例如某些科目需要加權等等)
但我a, b, c三種學生都依賴同一個底層function來計算最終成績(假設名稱為foo())

有一天b種類的學生需要更改成績的計算方式
所以就有某個倒楣鬼去做了修改,但他也沒有注意到它實際上有呼叫到foo()
結果就這樣上線了
直到運作了一陣子才發現成績全部都是錯的

也就是不同角色共用了某個function而導致這個狀況,在不知情的情況下
我們修改了功能,進而導致後面的問題產生

所以我們要怎麼解決這些問題

SRP說: 分開不同角色所依賴的程式碼
-Clean Architecture(P56)

解決方案

最明顯的方法就是我們去了解每個種類的學生
也就是想辦法把他們三種分開,變成三個可被追蹤的不同個體
套用到程式上就是
實體化不同的類別,使他們不瞭解彼此

這個Controller就只負責某個種類的學生
其他全部與他無關,也不清楚需要做甚麼

參考資料

Clean Architecture(ch.7)


上一篇
【Day-5】Clean Code(下)
下一篇
【Day-7】SOLID - 開放封閉原則(OCP)
系列文
軟體開發 - 程式不是會跑就好30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Hell Kiki
iT邦新手 4 級 ‧ 2023-09-07 18:18:26

個人淺見是對模組,對系統也應該有SRP,只是顆粒度大小的問題,比如student的class只負責student的事,訂單模組只關注訂單,email認證系統只負責認證email,…

以上述案例來看,將不同的student包成一包顯然不是個好作法
因為是將 "會考試" 就當作是學生
而忽略了他們的身分不同而有不同科目以及不同的計算方式

至於顆粒度大小的問題,以我個人的淺見來看確實是這樣沒錯
只是這個顆粒要切到多小就真的是一門藝術,很容易有過度設計的問題
上述的案例將student不做區分的做法就不太好
舉個其他例子
企鵝是鳥,但不會飛
如果把企鵝當作是鳥又要求他會飛
就會有點問題對吧

不過最終還是會回到團隊,通常團隊中其他人看過code不太需要解釋就能理解,我想就沒什麼問題

最後是系統的SRP,這部分就可以參考一下微服務架構,微服務架構就是專注於每一個系統就負責單一職責

我要留言

立即登入留言